#include "Tutorial_Matrices.h"

//
#include "Modules.h"

//
Hannover::Hannover()
:	_modules(0)
{
	_windowTitle = "Tutorial_Lighting";
}

Hannover::~Hannover()
{

}

bool Hannover::createModules()
{
	_modules = new Modules;
	
	//
	if (!_modules->create(_hwnd))
	{
		return false;
	}

	//
	return true;
}

bool Hannover::foreRender()
{
	//
	return true;
}

bool Hannover::rendering()
{
	//
	_modules->getRenderEngine()->getRenderSystem()->beginFrame(true, false, false);

	//
	renderGeometry();

	//
	_modules->getRenderEngine()->getRenderSystem()->endFrame();

	//
	return true;
}

bool Hannover::postRender()
{
	//
	return true;
}

bool Hannover::forePlay()
{
	//
	if (!createWindow())
	{
		return false;
	}

	//
	if (!adjustClientArea())
	{
		return false;
	}

	//
	if (!createModules())
	{
		return false;
	}

	//
	if (!setViewport())
	{
		return false;
	}
	
	//
	if (!initGeometry())
	{
		return false;
	}

	//
	return true;
}

bool Hannover::postPlay()
{
	//
	if (_modules)
	{
		_modules->close();
	}

	//
	return true;
}

bool Hannover::update()
{
	//
	if (NULL == _modules)
	{
		return false;
	}

	//
	if (!_modules->getRenderEngine()->getRenderSystem()->update())
	{
		return false;
	}

	//
	if (!Buddha::Mouse::getSingletonPtr()->update())
	{
		return false;
	}

	//
	return true;
}

bool Hannover::setViewport()
{
	//
	D3DVIEWPORT9 v;
	v.X = 0;
	v.Y = 0;
	v.Width = Buddha::WindowHelper::getSingletonPtr()->getClientWidth(_hwnd);
	v.Height = Buddha::WindowHelper::getSingletonPtr()->getClientHeight(_hwnd);
	v.MinZ = 0.0f;
	v.MaxZ = 1.0f;

	//
	if (!_modules->getRenderEngine()->getRenderSystem()->setViewport(&v))
	{
		return false;
	}

	//
	return true;
}

bool Hannover::initGeometry()
{
	// Initialize three Vertices for rendering a triangle
	Euclid::POSITION_COLOR Vertices[] =
	{
		Euclid::POSITION_COLOR( -1.0f,-1.0f, 0.0f, 0xffff0000), // x, y, z, rhw, color
		Euclid::POSITION_COLOR(1.0f,-1.0f, 0.0f, 0xff0000ff),
		Euclid::POSITION_COLOR(0.0f, 1.0f, 0.0f, 0xffffffff),
	};

	//
	_vb = _modules->getRenderEngine()->getBufferFactory()->createVertexBuffer(3 * sizeof(Euclid::POSITION_COLOR),
		0, D3DPOOL_DEFAULT);

	//
	if (!_vb)
	{
		return false;
	}

	//
	Euclid::POSITION_COLOR* b = (Euclid::POSITION_COLOR*)_vb->lock(0, sizeof(Vertices), 0);

	//
	memcpy( b, Vertices, sizeof(Vertices) );

	//
	_vb->unLock();

	//
	_modules->getRenderEngine()->getRenderSystem()->setRenderState(D3DRS_LIGHTING, false);

	//
	_modules->getRenderEngine()->getRenderSystem()->setRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

	//
	return true;
}

void Hannover::renderGeometry()
{
	//
	_modules->getRenderEngine()->getRenderSystem()->setVertexDeclaration(Euclid::VD_POSITION_COLOR);
	//
	_modules->getRenderEngine()->getRenderSystem()->setStreamSource(0, _vb, 0, sizeof(Euclid::POSITION_COLOR));	
	//
	_modules->getRenderEngine()->getRenderSystem()->drawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
	//
	_modules->getRenderEngine()->getRenderSystem()->setVertexDeclaration(Euclid::VD_NULL);
}